import time


def cv_model(img1, img2):
    # 关闭OpenCV的优化以保证结果一致性
    cv2.setUseOptimized(False)
    start_time = time.time()
    # 执行模板匹配，使用归一化相关系数方法
    result = cv2.matchTemplate(img1, img2, cv2.TM_CCOEFF_NORMED)
    print(f'CV模板匹配耗时: {time.time() - start_time:.6f}秒')
    # 寻找匹配结果中的最大值和最小值及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    return result, max_val, max_loc


if __name__ == '__main__':
    import cv2

    # 读取源图像和模板图像，以灰度模式读取
    # 请替换为你的图像路径
    source_image_path = 'source_image.jpg'  # 源图像路径
    template_image_path = 'template.png'  # 模板图像路径
    # 读取图像
    img = cv2.imread(source_image_path, cv2.IMREAD_GRAYSCALE)
    template = cv2.imread(template_image_path, cv2.IMREAD_GRAYSCALE)
    # 获取模板的宽高
    h, w = template.shape[:2]
    # 执行模板匹配
    result, max_val, max_loc = cv_model(img, template)
    # 打印匹配结果
    print(f"最大匹配值: {max_val:.6f} (值越接近1表示匹配度越高)")
    print(f"最佳匹配位置: {max_loc}")
    # 设置匹配阈值，只有当匹配值大于阈值时才认为是有效匹配
    threshold = 0.9
    if max_val >= threshold:
        # 获取最佳匹配区域的右下角坐标
        bottom_right = (max_loc[0] + w, max_loc[1] + h)
        # 在彩色图像上绘制矩形（先将灰度图转回彩色以便显示彩色矩形）
        img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
        cv2.rectangle(img_color, max_loc, bottom_right, (0, 255, 0), 2)
        # 可选：保存结果图像
        cv2.imwrite('matching_result.jpg', img_color)
        print("匹配结果已保存为 'matching_result.jpg'")
    else:
        print(f"未找到满足阈值({threshold})的匹配区域")
